package com.school.common.utils;

import java.security.SecureRandom;

public class RandomStringGeneratorUtils {
    // 定义字符池：大小写字母 + 数字 + 常用特殊符号（可根据需求调整）
    private static final String UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
    private static final String DIGITS = "0123456789";


    // 组合所有字符，形成完整字符池
    private static final String ALL_CHARS = UPPER_CASE + LOWER_CASE + DIGITS;

    // 使用 SecureRandom 保证随机性（比 Random 更安全）
    private static final SecureRandom SECURE_RANDOM = new SecureRandom();

    /**
     * 随机生成 6 位字符串（包含大小写字母、数字、特殊符号）
     * @return 6 位随机字符串
     */
    public static String generate6DigitRandomString() {
        // 字符串长度固定为 6
        int length = 6;
        StringBuilder sb = new StringBuilder(length);

        // 确保至少包含一种类型的字符（可选：如果不需要强制包含所有类型，可删除这部分逻辑）
        // 1. 先添加每种类型的一个字符（保证多样性）
        sb.append(UPPER_CASE.charAt(SECURE_RANDOM.nextInt(UPPER_CASE.length()))); // 大写字母
        sb.append(LOWER_CASE.charAt(SECURE_RANDOM.nextInt(LOWER_CASE.length()))); // 小写字母
        sb.append(DIGITS.charAt(SECURE_RANDOM.nextInt(DIGITS.length()))); // 数字

        // 2. 填充剩余 2 位（6 - 4 = 2），从所有字符中随机选择
        for (int i = 4; i < length; i++) {
            sb.append(ALL_CHARS.charAt(SECURE_RANDOM.nextInt(ALL_CHARS.length())));
        }

        // 3. 打乱字符串顺序（避免前 4 位固定为特定类型）
        return shuffleString(sb.toString());
    }

    /**
     * 打乱字符串顺序（基于 Fisher-Yates 洗牌算法）
     * @param str 待打乱的字符串
     * @return 打乱后的字符串
     */
    private static String shuffleString(String str) {
        char[] chars = str.toCharArray();
        for (int i = chars.length - 1; i > 0; i--) {
            int j = SECURE_RANDOM.nextInt(i + 1);
            // 交换字符
            char temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
        }
        return new String(chars);
    }
}
